Imports System.Reflection
Imports Softelvdm.Controls
Imports Softelvdm.SftTreeNET

Public Class Form1

Private m_PlusImage As Image = Bitmap.FromFile("..\\..\\ExpandableNormal.bmp") ' a small + bitmap
Private m_MinusImage As Image = Bitmap.FromFile("..\\..\\CollapsableNormal.bmp") ' a small - bitmap

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    ' This sample demonstrates drag & drop using one textbox control.
    ' To prepare for this sample, create a new project with a blank form and add
    ' a SftTree/NET control named sftTree1.
    ' In addition, a textbox named textbox1 is needed. Try dragging data from the
    ' tree control to the text box.
    ' It is also possible to drag files from Windows Explorer to the tree control. 
    ' No files are moved/copied, merely their names are added to the tree control.
    sftTree1.Initializing = True
    sftTree1.Columns.Count = 1
    For i As Integer = 0 To 9
        Dim item As ItemClass = sftTree1.ItemCollection.Add("Item " & i.ToString())
        For ic As Integer = 0 To 9
            Dim child As ItemClass
            child = item.Add("Child item " & ic.ToString())
        Next
    Next
    sftTree1.ItemCollection.Collapse(CollapseStyleEnum.All)
    sftTree1.Columns.MakeOptimal(0, False)
    sftTree1.RecalcHorizontalExtent()

    ' We need to set up the tree control as a drop target
    sftTree1.AllowDrop = True
    sftTree1.AutoExpandDragDrop = True
    sftTree1.AutoExpandArea = AutoExpandAreaEnum.AllColumns
    sftTree1.Initializing = False

    ' We also need to set up the text box so we can drop data
    textBox1.AllowDrop = True
End Sub

Private Sub sftTree1_DragDetected(ByVal sender As Object, ByVal e As Softelvdm.SftTreeNET.DragDetectedEventArgs) Handles sftTree1.DragDetected
    Debug.Print("We're starting to drag something")
    DumpValues(e)

    ' based on what we are dragging, make up a string
    Dim s As String = ""
    s = e.Area.ToString() & " in "
    s = s & e.Item.UsageLocation.ToString() & ": "
    If Not e.Cell Is Nothing Then
        If e.Cell.Text = "" Then
            s = s & "(empty cell) "
        Else
            s = s & e.Cell.Text & " "
        End If
    ElseIf Not e.RowHeader Is Nothing Then
        If e.RowHeader.Text = "" Then
            s = s & "(empty row header) "
        Else
            s = s & e.RowHeader.Text & " "
        End If
    ElseIf Not e.Item Is Nothing Then
        s = s & " an item "
    End If
    e.Handled = True
    sftTree1.DoDragDrop(s, DragDropEffects.Copy)
End Sub

Private Sub textBox1_DragEnter(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles textBox1.DragEnter
    Debug.Write("*** textBox1 DragEnter ")
    DumpValues(e)
    If e.Data.GetDataPresent(DataFormats.UnicodeText) Then
        e.Effect = DragDropEffects.Copy
    End If
End Sub
Private Sub textBox1_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles textBox1.DragDrop
    Debug.Write("*** textBox1 DragDrop ")
    DumpValues(e)
    If e.Data.GetDataPresent(DataFormats.UnicodeText) Then
        textBox1.Text = e.Data.GetData("System.String")
    End If
End Sub

Private Sub sftTree1_DragEnter(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles sftTree1.DragEnter
    Debug.Write("*** sftTree1 DragEnter ")
    DumpValues(e)
    If e.Data.GetDataPresent(DataFormats.UnicodeText) Then
        e.Effect = DragDropEffects.Copy
    ElseIf e.Data.GetDataPresent(DataFormats.FileDrop) Then
        e.Effect = DragDropEffects.Copy
    Else
        e.Effect = DragDropEffects.None
    End If
End Sub

Private Sub sftTree1_DragOver(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles sftTree1.DragOver
    ' in this example, if we don't have a valid drop target, 
    ' we STILL allow drops
    If sftTree1.DropTarget Is Nothing Then
        e.Effect = DragDropEffects.Copy
    End If
End Sub

Private Sub sftTree1_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles sftTree1.DragDrop
    Debug.Write("*** sftTree1 DragDrop ")
    DumpValues(e)

    Dim item As ItemClass = sftTree1.DropTarget

    Dim s As String = ""
    Dim a As Array = Nothing
    If e.Data.GetDataPresent(DataFormats.UnicodeText) Then
        s = e.Data.GetData("System.String")
    ElseIf (e.Data.GetDataPresent(DataFormats.FileDrop)) Then
        a = e.Data.GetData(DataFormats.FileDrop)
    Else
        Return
    End If

    Dim newItem As ItemClass = Nothing

    sftTree1.Initializing = True
    If s.Length > 0 Then
        If Not item Is Nothing Then
            newItem = item.Add(s)
            item.Expand(ExpandStyleEnum.DirectOnly)
        Else
            newItem = sftTree1.ItemCollection.Add(s)
        End If
    Else
        For Each o As Object In a
            s = o
            If Not item Is Nothing Then
                newItem = item.Add(s)
                item.Expand(ExpandStyleEnum.DirectOnly)
            Else
                newItem = sftTree1.ItemCollection.Add(s)
            End If
        Next
    End If
    sftTree1.Columns.MakeOptimal(0, False)
    sftTree1.RecalcHorizontalExtent()
    newItem.ScrollIntoView()
    sftTree1.FocusObject = newItem
    newItem.Selected = True
    sftTree1.Initializing = False
End Sub

' This is a small helper routine to show all properties and fields of an object
Private Sub DumpValues(ByVal o As Object)
    Dim api() As PropertyInfo = o.GetType().GetProperties()
    For Each pi As PropertyInfo In api
        Dim s As String
        On Error Resume Next
        pi.GetValue(o, New Object() {})
        Debug.Write(" " & pi.Name & " " & s)
    Next
    Dim afi() As FieldInfo = o.GetType().GetFields()
    For Each fi As FieldInfo In afi
        Dim t As Object = fi.GetValue(o)
        Dim s As String = "(null)"
        If Not t Is Nothing Then s = t.ToString()
        Debug.Write(" " & fi.Name & " " & s)
    Next
    Debug.WriteLine("")
End Sub

End Class